package com.tangsm.spring.boot.strategy.message.use;

import com.tangsm.spring.boot.strategy.message.interf.context.SendMessageInterfaceContext;
import com.tangsm.spring.boot.strategy.message.interf.context.SendMessageInterfaceAncestorsContext;
import com.tangsm.spring.boot.strategy.message.domain.Message;
import com.tangsm.spring.boot.strategy.message.enums.MessageEnum;
import com.tangsm.spring.boot.strategy.message.abstr.context.SendMessageAbstractContext;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 发送消息策略模式使用实例
 *
 * @author lakala
 */
@Component
public class MessageUse {
    /**
     * 抽象类实现发送消息策略工厂
     */
    @Autowired
    private SendMessageAbstractContext sendMessageAbstractContext;

    /**
     * 接口实现发送消息策略工厂
     */
    @Autowired
    private SendMessageInterfaceContext sendMessageInterfaceContext;

    /**
     * 接口实现发送消息策略工厂2
     */
    @Autowired
    private SendMessageInterfaceAncestorsContext sendMessageInterfaceAncestorsContext;

    /**
     * 发送消息验证码接口
     *
     * @param message 消息参数
     * @return 响应结果
     */
    public String sendAbs(Message message) {
        if (!typeValidate(message.getType())) {
            return String.format("不支持%s类型消息发送", message.getType());
        }
        return sendMessageAbstractContext.getInstance(message.getType()).send(message);
    }

    /**
     * 发送消息验证码接口Plus
     *
     * @param message 消息参数
     * @return 响应结果
     */
    public String sendInt(Message message) {
        if (!typeValidate(message.getType())) {
            return String.format("不支持%s类型消息发送", message.getType());
        }
        return sendMessageInterfaceContext.getInstance(message.getType()).send(message);
    }

    /**
     * 发送消息验证码接口
     *
     * @param message 消息参数
     * @return 响应结果
     */
    public String sendInt2(Message message) {
        if (!typeValidate(message.getType())) {
            return String.format("不支持%s类型消息发送", message.getType());
        }
        return sendMessageInterfaceAncestorsContext.getInstance(message.getType()).send(message);
    }

    /**
     * 判断消息类型是否符合条件
     *
     * @param type 消息类型
     * @return true-符合，false-符合
     */
    private boolean typeValidate(String type) {
        return StringUtils.isNotBlank(MessageEnum.getNameByCode(type));
    }
}
